#include "DeveloperModePlugin.h"
#include "DeveloperModeDialog.h"

#include <QAction>
#include <QMenu>

/**
 * @brief 构造函数
 * @param parent 父对象指针
 */
DeveloperModePlugin::DeveloperModePlugin(QObject *parent)
    : CameraPluginInterface(parent)
{
}

/**
 * @brief 析构函数
 * @details 保存配置并释放资源
 */
DeveloperModePlugin::~DeveloperModePlugin()
{
    m_pConfigManager->saveConfig();
}

/**
 * @brief 初始化插件
 * @details 执行插件启动所需的初始化操作，包括：
 *          1. 初始化验证状态
 *          2. 注册菜单项
 *          3. 创建并加载配置管理器
 */
void DeveloperModePlugin::initialize()
{
    // 初始化验证状态为false
    m_isVerified = false;
    // 注册开发者模式子菜单
    m_developerSubMenu = emit registerMenuItem(-1, "预设参数(P)");
    // 创建配置管理器实例
    m_pConfigManager = new ConfigManager(this);
    // 加载配置
    m_pConfigManager->loadConfig();
}

/**
 * @brief 获取插件名称
 * @return 插件名称，使用宏定义DEVELOPER_MODE_PLUGIN_NAME
 */
QString DeveloperModePlugin::pluginName() const
{
    return DEVELOPER_MODE_PLUGIN_NAME;
}

/**
 * @brief 获取插件描述信息
 * @return 插件描述字符串
 */
QString DeveloperModePlugin::description() const
{
    return "开发者模式插件，用于设备参数设置和图像预处理配置";
}

/**
 * @brief 弹出开发者模式对话框
 * @details 创建并显示开发者模式对话框，处理对话框的信号和返回结果
 */
void DeveloperModePlugin::showDeveloperModeDialog()
{
    // 创建开发者模式对话框
    DeveloperModeDialog dialog;
    // 连接对话框的writeLog信号到当前插件的onWriteLog槽
    connect(&dialog, &DeveloperModeDialog::writeLog, this, &DeveloperModePlugin::onWriteLog);
    // 显示对话框并等待用户操作
    if (dialog.exec() == QDialog::Accepted)
    {
        // 验证成功，启用子菜单
        m_isVerified = true;
    }
}

/**
 * @brief 接收插件消息
 * @param sender 发送消息的插件名称
 * @param message 消息内容
 * @details 当前实现为空，预留用于处理来自其他插件的消息
 */
void DeveloperModePlugin::onPluginMessage(const QString& sender, const QString& message)
{
    Q_UNUSED(sender)
    Q_UNUSED(message)
}

/**
 * @brief 写入日志
 * @param logInfo 日志信息
 * @param logLevel 日志级别（0: INFO, 1: WARNING, 2: ERROR）
 * @param isSave 是否保存到文件
 * @details 将日志信息发送到日志插件
 */
void DeveloperModePlugin::onWriteLog(const QString &logInfo, int logLevel, bool isSave)
{
    // 日志级别字符串映射
    static QStringList logLevelStr = {"INFO", "WARNING", "ERROR"};
    // 发送日志消息到日志插件
    emit pluginMessageSent(DEVICE_MANAGEMENT_PLUGIN_NAME, 
                          QString(CMD_LOG ":%1:%2:%3").arg(logLevelStr[logLevel])
                                                   .arg(isSave ? "true" : "false")
                                                   .arg(logInfo), 
                          LOG_PLUGIN_NAME);
}

// ========== ConfigManager接口实现 ==========

/**
 * @brief 批量获取配置参数
 * @param configName 配置名称
 * @param paramNames 参数名称列表
 * @return 参数名称到值的映射
 */
QVariant DeveloperModePlugin::batchGetConfigParams(const QVariant &configName, const QVariant &paramNames) const
{
    if (m_pConfigManager) {
        return m_pConfigManager->batchGetConfigParams(configName.toString(), paramNames.toStringList());
    }
    return QVariantMap();
}

/**
 * @brief 批量设置配置参数
 * @param configName 配置名称
 * @param configParams 参数名称到值的映射
 * @return 空QVariant
 */
void DeveloperModePlugin::batchSetConfigParams(const QVariant &configName, const QVariant &configParams)
{
    if (m_pConfigManager) {
        m_pConfigManager->batchSetConfigParams(configName.toString(), configParams.toMap());
    }
}

/**
 * @brief 设置所有配置参数
 * @param configName 配置名称
 * @param configParams 参数名称到值的映射
 */
void DeveloperModePlugin::setConfigParams(const QVariant &configName, const QVariant &configParams)
{
    if (m_pConfigManager) {
        m_pConfigManager->setConfigParams(configName.toString(), configParams.toMap());
    }
}

/**
 * @brief 获取所有配置参数
 * @param configName 配置名称
 * @return 参数名称到值的映射
 */
QVariant DeveloperModePlugin::getConfigParams(const QVariant &configName) const
{
    if (m_pConfigManager) {
        return m_pConfigManager->getConfigParams(configName.toString());
    }
    return QVariantMap();
}

/**
 * @brief 获取单个配置参数
 * @param configName 配置名称
 * @param paramName 参数名称
 * @param defaultValue 默认值，当参数不存在时返回
 * @return 参数值，如果参数不存在则返回默认值
 */
QVariant DeveloperModePlugin::getConfigParam(const QVariant &configName, const QVariant &paramName, 
                                           const QVariant &defaultValue) const
{
    if (m_pConfigManager) {
        return m_pConfigManager->getConfigParam(configName.toString(), paramName.toString(), defaultValue);
    }
    return defaultValue;
}

/**
 * @brief 设置单个配置参数
 * @param configName 配置名称
 * @param paramName 参数名称
 * @param value 参数值
 */
void DeveloperModePlugin::setConfigParam(const QVariant &configName, const QVariant &paramName,
                                       const QVariant &value)
{
    if (m_pConfigManager) {
        m_pConfigManager->setConfigParam(configName.toString(), paramName.toString(), value);
    }
}

/**
 * @brief 从文件加载配置
 * @param filePath 文件路径，如果为空则使用默认路径
 * @return 加载是否成功
 */
QVariant DeveloperModePlugin::loadConfig(const QVariant &filePath)
{
    if (m_pConfigManager) {
        return m_pConfigManager->loadConfig(filePath.toString());
    }
    return false;
}

/**
 * @brief 保存配置到文件
 * @param filePath 文件路径，如果为空则使用默认路径
 * @return 保存是否成功
 */
QVariant DeveloperModePlugin::saveConfig(const QVariant &filePath)
{
    if (m_pConfigManager) {
        return m_pConfigManager->saveConfig(filePath.toString());
    }
    return false;
}

/**
 * @brief 添加新配置
 * @param configName 配置名称
 * @param configParams 参数名称到值的映射
 */
void DeveloperModePlugin::addConfig(const QVariant &configName, const QVariant &configParams)
{
    if (m_pConfigManager) {
        m_pConfigManager->addConfig(configName.toString(), configParams.toMap());
    }
}

/**
 * @brief 删除配置
 * @param configName 配置名称
 */
void DeveloperModePlugin::removeConfig(const QVariant &configName)
{
    if (m_pConfigManager) {
        m_pConfigManager->removeConfig(configName.toString());
    }
}

/**
 * @brief 检查配置是否存在
 * @param configName 配置名称
 * @return 配置是否存在
 */
QVariant DeveloperModePlugin::containsConfig(const QVariant &configName) const
{
    if (m_pConfigManager) {
        return m_pConfigManager->containsConfig(configName.toString());
    }
    return false;
}

/**
 * @brief 获取所有配置名称
 * @return 配置名称列表
 */
QVariant DeveloperModePlugin::getConfigNames() const
{
    if (m_pConfigManager) {
        return m_pConfigManager->getConfigNames();
    }
    return QStringList();
}

/**
 * @brief 检查配置参数是否存在
 * @param configName 配置名称
 * @param paramName 参数名称
 * @return 参数是否存在
 */
QVariant DeveloperModePlugin::containsConfigParam(const QVariant &configName, const QVariant &paramName) const
{
    if (m_pConfigManager) {
        return m_pConfigManager->containsConfigParam(configName.toString(), paramName.toString());
    }
    return false;
}

/**
 * @brief 注册预设参数菜单项
 * @param menuText 菜单项文本
 * @return 菜单项动作的QVariant包装
 */
QVariant DeveloperModePlugin::registerPresetParamMenuItem(const QVariant &menuText)
{
    if(!menuText.isValid())
    {
        QVariant::fromValue(nullptr);
    }
    // 创建新的菜单项动作
    QAction *action = new QAction(menuText.toString(), m_developerSubMenu);
    m_developerSubMenu->addAction(action);

    return QVariant::fromValue(action);
}

/**
 * @brief 注册预设参数菜单项
 * @param menuText 菜单项文本
 * @param dialog 弹出对话框
 * @return 菜单项动作的QVariant包装
 */
QVariant DeveloperModePlugin::registerPresetParamMenuItem(const QVariant &menuText, const QVariant &dialog)
{
    if(!menuText.isValid()||!dialog.isValid()||!dialog.canConvert<QDialog*>())
    {
        return false;
    }
    QAction *action=registerPresetParamMenuItem(menuText).value<QAction *>();
    QDialog* pDioalog=dialog.value<QDialog*>();
    connect(action,&QAction::triggered,[this,pDioalog](bool)
    {
        if(!m_isVerified)
        {
            showDeveloperModeDialog();
        }
        if(m_isVerified)
        {
             pDioalog->exec();
        }
    });
    return true;
}

